package com.bestcem.xm.award.service;

import cn.xuyanwu.spring.file.storage.FileInfo;
import com.bestcem.xm.award.controller.param.award.GetWeekRequestStatsParam;
import com.bestcem.xm.award.controller.vo.award.GetWeekRequestStatsVO;
import com.bestcem.xm.award.entity.pojo.AwardAwardDO;
import com.bestcem.xm.award.entity.pojo.AwardRequestDO;
import com.bestcem.xm.award.enums.AwardTypeEnum;
import com.bestcem.xm.award.grpc.service.param.award.*;
import com.bestcem.xm.award.grpc.service.param.requestaward.GetRequestAwardParam;
import com.bestcem.xm.award.service.bo.award.AwardAwardBO;
import com.bestcem.xm.award.service.dto.AwardDataDTO;
import com.bestcem.xm.award.service.dto.awardaward.*;
import com.bestcem.xm.award.service.dto.draw.ExportWinnerDetailDTO;
import com.bestcem.xm.award.service.dto.requestaward.RequestAwardDTO;
import com.bestcem.xm.common.core.domain.web.PageResultDTO;
import com.bestcem.xm.common.core.domain.web.ServiceResult;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 奖励元数据服务
 *
 * @author sh.pei <sh.pei@idiaoyan.com>
 * @version v1.0
 * @date 2021/7/1 10:53
 */
public interface AwardAwardService {

    /**
     * 根据id查询奖励数据
     *
     * @param getAwardDTO 查询奖励入参
     * @return 奖励数据
     */
    ServiceResult<AwardDataDTO> getAward(GetAwardDTO getAwardDTO);

    /**
     * 分页查询awards列表
     *
     * @param listPageAwardDTO 分页列表查询条件
     * @return 奖励分页列表
     */
    ServiceResult<PageResultDTO<AwardAwardBO>> listPageAward(ListPageAwardDTO listPageAwardDTO);

    /**
     * 创建奖励
     *
     * @param createAwardDTO 创建奖励入参
     * @return 奖励id
     */
    ServiceResult<String> createAward(CreateAwardDTO createAwardDTO);

    /**
     * 更新奖励
     *
     * @param updateAwardDTO 更新奖励入参
     * @return 影响行数
     */
    ServiceResult<String> updateAward(UpdateAwardDTO updateAwardDTO);

    /**
     * 删除奖励
     *
     * @param deleteAwardDTO 删除奖励入参
     * @return 影响行数
     */
    ServiceResult<Integer> deleteAward(DeleteAwardDTO deleteAwardDTO);

    /**
     * 更新奖励状态
     *
     * @param updateAwardStatusDTO
     * @return
     */
    ServiceResult<String> updateAwardStatus(UpdateAwardStatusDTO updateAwardStatusDTO);

    /**
     * 获取所属的奖励类型
     *
     * @return
     */
    AwardTypeEnum getAwardTypeEnum();

    /**
     * 答题端完成答卷获取奖励
     *
     * @param getRequestAwardParam 请求参数
     * @return 不同类型的奖励，返回结构体不同，因此返回json字符串
     */
    ServiceResult<String> requestAward(GetRequestAwardParam getRequestAwardParam);

    /**
     * 根据不同的奖励类型获取奖励
     *
     * @param requestAwardDTO 请求参数
     * @return 不同类型的奖励，返回结构体不同，因此返回json字符串
     */
    ServiceResult<String> doRequestAward(RequestAwardDTO requestAwardDTO);

    /**
     * 查询奖励请求数量和请求状态为请求通过的请求数量
     *
     * @param getRequestStatsParam 请求参数
     * @return GetRequestStatsDTO 奖励请求数量和请求状态为请求通过的请求数量
     */
    ServiceResult<GetRequestStatsDTO> getRequestStats(GetRequestStatsParam getRequestStatsParam);

    /**
     * 查询最近一周奖励请求数量和请求状态为请求通过的请求数量
     *
     * @param getWeekRequestStatsParam 请求参数
     * @return GetWeekRequestStatsVO 最近一周奖励请求数量和请求状态为请求通过的请求数量
     */
    ServiceResult<GetWeekRequestStatsVO> getWeekRequestStats(GetWeekRequestStatsParam getWeekRequestStatsParam);

    /**
     * 删除附件
     *
     * @param deleteAttachmentParam 请求参数
     * @return 删除附件id
     */
    ServiceResult<String> deleteAttachment(DeleteAttachmentParam deleteAttachmentParam);

    /**
     * 上传附件
     *
     * @param file 上传附件
     * @return 附件保存记录
     */
    ServiceResult<FileInfo> uploadAttachment(MultipartFile file);

    /**
     * 获取奖项等级、奖项名称(筛选条件)
     *
     * @param listAwardsLevelNamesParam 请求参数
     * @return 奖项等级、名称的筛选条件
     */
    ServiceResult<AwardsDTO> listAwardsLevelNames(ListAwardsLevelNamesParam listAwardsLevelNamesParam);

    /**
     * 通过excel文件上传兑奖码信息
     *
     * @param importDrawCodesParam 请求参数
     * @return AWARD_TEMP表temp_id
     */
    @Deprecated
    ServiceResult<String> importDrawCodes(ImportDrawCodesParam importDrawCodesParam);

    /**
     * 通过excel文件上传兑奖码信息(少于一万)
     *
     * @param file 兑奖码文件
     * @return 兑奖码信息列表
     */
    ServiceResult<List<ExportWinnerDetailDTO>> importDrawCodesLessThanTenThousand(MultipartFile file);

    /**
     * 导出兑奖码文件excel
     *
     * @param exportDrawCodesParam 请求参数
     * @return oss文件信息
     */
    @Deprecated
    ServiceResult<FileInfoDTO> exportDrawCodes(ExportDrawCodesParam exportDrawCodesParam);

    /**
     * 奖励创建和修改时的通用参数校验
     *
     * @param awardAward 奖励数据
     * @return 校验结果
     */
    ServiceResult<String> commonCheckAward(AwardAwardBO awardAward);

    /**
     * 检查奖励个数是否达到最大值
     *
     * @param orgId     公司id
     * @param projectId 项目id
     * @return
     */
    ServiceResult<String> checkAwardCount(String orgId, String projectId);

    /**
     * 检查名称重复
     *
     * @param name      名称
     * @param projectId 项目id
     * @param awardId   奖励id
     * @return
     */
    ServiceResult<String> checkDuplicateName(String name, String projectId, String awardId);

    /**
     * 各个奖励类独立的校验
     *
     * @param awardAward 奖励数据
     * @return 校验结果
     */
    ServiceResult<String> independentCheckAward(AwardAwardBO awardAward);

    /**
     * 检查是否可以删除奖励
     *
     * @param awardAwardDO
     * @return
     */
    ServiceResult<String> checkDeleteAward(AwardAwardDO awardAwardDO);

    /**
     * 根据id查询奖励请求记录
     *
     * @param requestId 请求记录id
     * @return 奖励请求记录
     */
    ServiceResult<AwardRequestDO> getAwardRequestById(String requestId);

    /**
     * 根据经理id列表查询奖励列表
     *
     * @param awardIds 奖励id列表
     * @return 奖励列表
     */
    ServiceResult<List<AwardAwardBO>> listAwardsByIds(List<String> awardIds);

    /**
     * 生命周期方法，奖励创建后
     *
     * @param awardId
     * @return
     */
    ServiceResult<String> afterAwardCreate(String orgId, String projectId, String awardId);

    /**
     * 生命周期方法,奖励删除后
     *
     * @param awardId
     * @return
     */
    ServiceResult<String> afterAwardDelete(String orgId, String projectId, String awardId);

    /**
     * 奖励结束前置操作
     *
     * @param awardId 奖励id
     * @return 操作结果
     */
    ServiceResult<String> beforeFinishAward(String awardId);
}
